前言¶
本文档详细介绍了WS53V100 Wi-Fi、BLE&SLE接口功能以及开发流程。
与本文档对应的产品版本如下。
本文档主要适用以下工程师:
技术支持工程师
软件开发工程师
在本文中可能出现下列标志,它们所代表的含义如下。
更新“注意事项”小节内容。 |
||
|
||
更新“注意事项”小节内容。 |
||
|
||
概述¶
WS53V100 通过API(Application Programming Interface)面向开发者提供Wi-Fi功能的开发和应用接口,包括芯片初始化、资源配置、Station创建和配置、扫描、关联以及去关联、状态查询等一系列功能,框架结构如图1所示。

各功能模块说明如下:
业务层:用户基于API接口的二次开发。
应用层协议:应用层网络协议。
LWIP协议栈:轻量级的TCP/IP协议栈。
WiFi Service:提供基于SDK的WiFi通用接口。
BLE Service:提供基于SDK的BLE通用接口。
SLE Service:提供基于SDK的SLE通用接口。
BSP Driver:芯片和外围设备驱动。
WLAN Driver:802.11协议实现模块。
BLE&SLE Controller:BLE及星闪协议实现模块。
说明: 该文档描述各个模块功能的开发流程。
Wi-Fi 软件开发指南¶
驱动加载与卸载¶
概述¶
在完成芯片上电后,驱动加载实现对芯片寄存器的初始配置、校准参数读取与写入、软件资源的申请和配置;驱动卸载实现软件资源的释放。
开发流程¶
Wi-Fi驱动初始化为Wi-Fi功能提供基本资源配置和芯片初始化,是Wi-Fi功能实现的第一步。当需要配置Wi-Fi功能时,必须先完成驱动的初始化,Wi-Fi功能使用完成后,可以使用去初始化完成资源释放也可以使用软复位来完成资源释放。
Wi-Fi驱动加载与卸载提供的接口如表1所示。
表 1 Wi-Fi驱动加载与卸载接口描述
使用驱动加载与卸载的典型流程:
Wi-Fi驱动加载与卸载的返回值如表2所示。
表 2 Wi-Fi驱动加载与卸载返回值说明
编程实例¶
示例1:基于LiteOS的app_main函数,在系统初始化时已自动完成Wi-Fi驱动的加载,此加载方式无须执行,系统reboot时自动完成驱动卸载和加载。
代码示例
td_void app_main(td_void)
{
td_u32 ret;
ret = wifi_init();
if (ret != 0) {
printf("fail to init wifi\n");
} else {
printf("wifi init success\n");
}
//此处添加测试代码
ret = wifi_deinit();
if (ret != 0) {
printf("fail to deinit wifi\n");
} else {
printf("wifi deinit success\n");
}
return;
}
结果验证
wifi init success
wifi deinit success
STA功能¶
概述¶
STA功能即Station功能,实现驱动STA设备的创建、扫描、关联以及DHCP,完成通信链路的建立。开发STA功能前,须完成驱动加载。
开发流程¶
当需要接入某个网络并与该网络通信时,需要启动STA功能。
驱动STA功能提供的接口如表1所示。
表 1 驱动STA功能接口描述
STA功能开发的典型流程:
调用wifi_sta_enable,启动STA。
(可选,根据需要配置)调用wifi_sta_set_reconnect_policy,设置自动重连。
调用wifi_sta_scan(或调用aich_wifi_sta_advance_scan,执行带参数扫描),触发STA扫描。
调用wifi_sta_get_scan_info,获取扫描结果。
根据接入网络需求,自定义筛选扫描结果,调用wifi_sta_connect,进行连接。
调用wifi_sta_get_ap_info,查询Wi-Fi连接状态。
连接成功后,调用netifapi_dhcp_start,启动DHCP客户端,获取IP地址。
调用wifi_sta_disconnect,离开当前连接的网络。
(可选)调用netifapi_dhcps_stop,停止DHCP客户端。
调用wifi_sta_disable,关闭STA(会自动关闭DHCP客户端)。
STA功能的返回值如表2所示。
表 2 STA功能返回值说明
注意事项¶
扫描为非阻塞式接口,扫描命令下发成功后需要延迟一段时间后再获取扫描结果,全信道扫描延迟时间建议设置为1s。
可通过指定SSID、BSSID、信道等带指定参数的扫描,实现更精准地扫描,缩短扫描时间。
已知待连接网络的参数时,可省去扫描过程,直接发起连接。
连接为非阻塞式接口,连接命令下发成功后,需要通过命令获取连接状态。
注册事件回调函数后,Wi-Fi相关的事件会通过该回调上报用户,用户可根据事件执行后续动作。
不支持重复启动STA,再次启动STA时须先执行关闭STA。
关闭STA步骤为可选,设备所处的网络地位不变,不需要执行关闭STA。
STA默认支持发送和接收AMPDU聚合帧。
Sample用例¶
说明:
STA Sample文件位于application\samples\wifi\sta_sample目录;
实现当STA Sample软件版本成功烧录后,单板启动时会自启动STA,并不停的扫描,直到发现存在SSID为“my_softAP”的目标AP,然后会通过密码“my_password”进行连接,若连接失败,则重复扫描动作,若连接成功,则进一步获取动态IP地址,获取IP成功后,串口会打印“STA connect success.”
在SDK包的根目录下,执行命令“python3 build.py ws53_liteos_app menuconfig”进入menuconfig。
依次选择Application -> Enable Sample -> Enable the Sample of WIFI -> Sample -> Support WIFI STA Sample,并按S键保存,然后通过Esc键退出menuconfig
在SDK包的根目录下,执行命令“python3 build.py ws53_liteos_app”,即可编译STA Sample软件版本
SoftAp功能¶
概述¶
SoftAp功能提供网络接入点供其他STA接入,并对接入的STA提供DHCP Server服务。
开发流程¶
当需要创建一个网络接入点,供其他设备接入并共享网络内的数据时,需要使用SoftAp功能。
驱动SoftAp功能提供的接口如表1所示。
表 1 驱动SoftAp功能接口描述
SoftAp功能开发的典型流程:
(可选)调用wifi_set_softap_config_advance,设置SoftAp协议模式、beacon周期、dtim周期、秘钥更新时间、是否隐藏SSID、GI参数。
调用wifi_softap_start,启动SoftAp。
调用netifapi_netif_set_addr,配置DHCP服务器。
调用netifapi_dhcps_start,启动DHCP服务器。
(可选)调用netifapi_dhcps_stop,停止DHCP服务器。
调用aich_wifi_softap_stop,关闭SoftAp(会自动关闭DHCP服务器)。
SoftAp功能的返回值如表2所示。
表 2 SoftAp功能返回值说明
注意事项¶
SoftAp的网络参数为可选配置,无特殊要求均可使用初始默认值。
SoftAp默认启动20M带宽SoftAp。
SoftAp的网络参数在关闭SoftAp时不会重置,会继续沿用上一次配置,重启单板可恢复至初始默认值。
SoftAp模式下最大关联用户数限制:
最大关联用户不超过4个。
Sample用例¶
说明:
SoftAp Sample文件位于application\samples\wifi\softap_sample目录
实现当SoftAP Sample软件版本成功烧录后,单板启动时会自启动SoftAp,其加密方式为wpa/wpa2,SSID为“my_softAP”,密码为“my_password”,IP地址默认设置为192.168.43.1,网关地址默认设置为192.168.43.2
在SDK包的根目录下,执行命令“python3 build.py ws53_liteos_app menuconfig”进入menuconfig。
依次选择Application -> Enable Sample -> Enable the Sample of WIFI -> Sample -> Support WIFI SoftAP Sample,并按S键保存,然后通过Esc键退出menuconfig
在SDK包的根目录下,下发命令“python3 build.py ws53_liteos_app”,即可编译SoftAP Sample软件版本
STA&SoftAp共存¶
概述¶
STA&SoftAp共存即STA功能和SoftAp功能同时工作,仅支持同信道共存。
开发流程¶
配网时,产品先启动SoftAp,手机关联SoftAp后发送家居网络的SSID和密码给产品,产品获取到家居网络的连接参数后启动STA关联家居网络,完成产品联网,产品联网成功后,关闭SoftAp,只保留STA作为端侧长期保持连接。其他共存场景可视产品形态和需求自行使用。
共存功能分别使用STA功能和SoftAp功能的API接口,无额外新增API接口。
配网模式下共存功能开发的典型流程:
创建SoftAp网络接口(详细内容请参见“SoftAp功能”)。
手机关联SoftAp,并通过手机APP发送家居网络SSID和密码。
创建STA网络接口,并根据SSID和密码完成关联(详细内容请参见“STA功能”)。
关闭SoftAp(详细内容请参见“SoftAp功能”)。
返回值请参见对应模块功能的返回值说明。
编程实例¶
Wi-Fi&蓝牙共存¶
概述¶
蓝牙(BT,Bluetooth)和Wi-Fi均可能工作在2.4GHz频段,因此可能互相干扰。分时是利用蓝牙和Wi-Fi间的握手信号,使蓝牙和Wi-Fi分时在2.4G工作,这样可以避免噪音干扰和阻塞干扰。
802.15.2规定仲裁方式和信号(PTA,Packet Traffic Arbitration)的框架,在蓝牙或Wi-Fi有收发业务时,提交申请给PTA controller(集成在Wi-Fi中),由PTA controller进行许可。
蓝牙和Wi-Fi间的握手信号定义如下:
Wi-Fi给PTA信号wl_tx_status:Wi-Fi有发包业务。
Wi-Fi给PTA信号wl_rx_status:Wi-Fi有收包业务。
Wi-Fi给PTA信号wl_priority:Wi-Fi业务状态,Wi-Fi高优先级。
Wi-Fi给PTA信号wl_occupied:Wi-Fi业务状态,Wi-Fi最高优先级。
蓝牙给PTA信号bt_status:蓝牙有收发业务。
蓝牙给PTA信号bt_priority:蓝牙业务状态,指示蓝牙优先级。
开发流程¶
需要同时使用Wi-Fi和蓝牙时,开启Wi-Fi&BT共存功能。
Wi-Fi&BT共存功能开发的典型流程:
加载蓝牙后,执行蓝牙共存初始化函数
创建STA网络接口(详细内容请参见“STA功能”)。
创建蓝牙业务(详情内容请参见“BLE&SLE 软件开发指南”)
注意事项¶
Wi-Fi与BT共存支持STA模式、支持SoftAp模式。
模组或产品内同时集成了Wi-Fi芯片和蓝牙芯片,常开Wi-Fi&BT共存功能。
国家码功能配置¶
使用背景¶
对于发货给不同国家的用户,希望使用同一套固件,可以通过修改NV中的管制域信息(包括国家码,信道, 发射功率等)实现。
使用指南¶
在NV配置文件middleware/chips/ws53/nv/nv_config/cfg/acore/app.json中,NV ID ="0x2003" 的表项用于确定国家码,value的含义是国家码对应ASIC码,例如:十进制67,78分别对应ASIC码中的 'C', 'N'
"country":{ "key_id": "0x2003", "key_status": "alive", "structure_type": "country_type_t", "attributions": 2, "value": [[67,78]] },
国家码与四个区域管制域的对应关系如表1所示。
表 1 区域与国家码对应表
RU,AU,MY,ID,TR,PL,FR,PT,IT,DE,ES,AR,ZA,MA,PH,TH,GB,CO,MX,EC,PE,CL,SA,EG,AE
基于步骤1确定的对应关系,刷新对应的发射功率表项,支持调整不同速率的目标功率,以及调整在不同工作信道下的最大功率。
刷新0x2053,0x2054,0x2055,0x2056表项:
"fe_tx_power_fcc":{ "key_id": "0x2053", "key_status": "alive", "structure_type": "fe_tx_power_type_t", "attributions": 1, "value": [ [230], [44, 44, 44, 42, 42, 42, 42, 42, 42, 42, 40, 38, 40, 40, 40, 37, 37, 37, 37, 36, 33, 30, 40, 40, 40, 37, 37, 37, 37, 36, 33, 30, 22], [60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60], [60, 60, 60] ] },
"fe_tx_power_etsi":{ "key_id": "0x2054", "key_status": "alive", "structure_type": "fe_tx_power_type_t", "attributions": 1, "value": [ [230], [44, 44, 44, 42, 42, 42, 42, 42, 42, 42, 40, 38, 40, 40, 40, 37, 37, 37, 37, 36, 33, 30, 40, 40, 40, 37, 37, 37, 37, 36, 33, 30, 22], [60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60], [60, 60, 60] ] },
"fe_tx_power_japan":{ "key_id": "0x2055", "key_status": "alive", "structure_type": "fe_tx_power_type_t", "attributions": 1, "value": [ [230], [44, 44, 44, 42, 42, 42, 42, 42, 42, 42, 40, 38, 40, 40, 40, 37, 37, 37, 37, 36, 33, 30, 40, 40, 40, 37, 37, 37, 37, 36, 33, 30, 22], [60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60], [60, 60, 60] ] },
"fe_tx_power_common":{ "key_id": "0x2056", "key_status": "alive", "structure_type": "fe_tx_power_type_t", "attributions": 1, "value": [ [230], [44, 44, 44, 42, 42, 42, 42, 42, 42, 42, 40, 38, 40, 40, 40, 37, 37, 37, 37, 36, 33, 30, 40, 40, 40, 37, 37, 37, 37, 36, 33, 30, 22], [60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60], [60, 60, 60] ] },
上述"value"定义的发射功率参见fe_tx_power_type_t结构体:
#define WLAN_RF_FE_MAX_POWER_NUM 1 #define WLAN_RF_FE_TARGET_POWER_NUM 33 #define WLAN_RF_FE_LIMIT_POWER_NUM 56 #define WLAN_RF_FE_SAR_POWER_NUM 3 typedef struct { uint8_t chip_max_power[WLAN_RF_FE_MAX_POWER_NUM]; uint8_t target_power[WLAN_RF_FE_TARGET_POWER_NUM]; uint8_t limit_power[WLAN_RF_FE_LIMIT_POWER_NUM]; uint8_t sar_power[WLAN_RF_FE_SAR_POWER_NUM]; } fe_tx_power_type_t;
其中:
chip_max_power是最大发射功率,当前已更新为芯片实际能力。单位0.1dBm。
target_power 是不同协议速率下的目标功率,依次分别是11b协议(1M,2M,5.5M,11M),11g协议(6M,9M,12M,18M,24M,36M,48M,54M),11n/11ax协议20M(mcs0~mcs9),11n/11ax协议40M(mcs0~mcs9以及mcs32)。单位0.5dB。
limit_power 是按信道划分的限制功率,总共14个信道,每个信道4个限制功率值,分别对应11b协议、11g协议、11n/11ax协议20M、11n/11ax协议40M。单位0.5dB。依次分别是信道1(11b协议,11g协议,11n/11ax协议20M,11n/11ax协议40M),信道2(11b协议,11g协议,11n/11ax协议20M,11n/11ax协议40M),后续依此类推。
sar_power 是比吸收率功率限制值,共三个值用于选择。单位0.5dB。
刷新NV配置文件后重新编译NV固件并加载。NV支持配置四个区域的发射功率。用户可以调用 AT命令AT+CC=${COUNTRY} 实现国家码变更,从而按照国家码所处的区域更新功率表。
其中${COUNTRY} 从步骤1 中的region_country_map中取。
说明:
最大发射功率不支持修改,已按照芯片能力配置,修改可能导致发射功率异常。
用户自定义发射功率表项时, 不得超过最大的射频发射功率。
11n 支持20M和40M,最大支持速率mcs7,不支持mcs32;11ax 不支持40M
AT+CC命令需要在上电之后,并且关联上用户之前进行调用。
BLE&SLE 软件开发指南¶
BLE开发流程¶
概述¶
WS53V100通过API(Application Programming Interface)面向开发者提供BLE功能的开发和应用接口,包括GAP、GATT server和GATT client接口。
各组件功能说明如下:
GAP:通用访问协议(Generic Access Profile),包含蓝牙本地设置和低功耗蓝牙的发现和连接接口。
GATT:通用属性协议(Generic Attribute Profile),包含服务注册、服务发现等功能相关接口。
说明:
该文档描述各个模块功能的基本流程和API接口描述。
GAP接口¶
概述¶
GAP实现蓝牙设备开关控制、设备信息管理、广播管理、主动连接和断开连接等功能。
开发流程¶
打开蓝牙设备开关是使用蓝牙功能的首要条件,蓝牙启动后可进行设备信息管理,包括获取与设置本地设备名称、获取本地设备地址、获取配对信息、获取远端设备名称/设备类型/接收信号强度等。
当蓝牙设备需要被动与对端设备建立连接时,可设置广播参数并启动广播等待对端连接;当蓝牙设备需要主动与对端设备建立连接时,可向对端发起主动连接;当对端地址已知时,用户可直接向对端发起主动连接;当对端地址未知时,可打开蓝牙设备的扫描功能,获取正在广播的设备信息,并向对端发起主动连接;当蓝牙设备处于连接状态时,可获取设备连接信息;当蓝牙设备不需要与对端设备保持连接时,可主动断开连接。
GAP提供的接口如下表所示。
|
注: 若需使用NV或Efuse里的地址, 调用'get_dev_addr'接口获取当前已存储的地址, 然后调用本接口将地址设置到BTH与BTC. |
|||
具体操作流程:
GAP开发的具体编程实例可参考application/samples/bt。
GAP开发的典型流程如下(指令中的数据可根据按照《WS53V100 AT命令使用指南》自行修改):
Slave:
调用gap_ble_register_callbacks注册用户回调函数。
调用enable_ble,打开蓝牙开关。
调用gap_ble_set_local_addr,设置本地蓝牙地址。
调用gap_ble_set_local_name,设置本地设备名称。
调用gap_ble_set_adv_param,设置广播参数
调用gap_ble_set_adv_data,设置广播数据
调用gap_ble_start_adv,启动广播。
Master:
调用gap_ble_register_callbacks注册用户回调函数。
调用enable_ble,打开蓝牙开关。
调用gap_ble_set_local_addr,设置本地蓝牙地址。
调用gap_ble_set_local_name,设置本地设备名称。
调用gap_ble_set_scan_parameters,设置扫描参数
调用gap_ble_start_scan,启动扫描
调用gap_connect_remote_device,连接到目标设备。
调用gap_ble_pair_remote_device,与目标设备配对
GAP停止蓝牙流程:
slave:
确认是否存在未关闭的广播,如果存在需要调用gap_ble_stop_adv停止广播。
调用disable_ble,停止蓝牙。
master
调用disable_ble,停止蓝牙。
获取配对状态返回值如下表所示。
注意事项¶
若扫描不到设备,请先检查设备是否已在配对设备列表中,或者设备是否已与其他设备配对(此情况下需要先清除设备端配对信息)。
协议栈默认不保存密钥到FLASH中。若需要持久化保存密钥,需参考《WS53V100 SDK开发环境搭建 用户指南》中“Menuconfig配置”节。当在Menuconfig中打开星闪/蓝牙模块的密钥持久化能力后,协议栈会将密钥加密保存;需要注意的是,不建议反复开关平台加密特性(即CONFIG_NV_SUPPORT_ENCRYPT),否则可能出现密钥预期不一致问题,具体原因见《WS53V100 NV存储 用户指南》中“注意事项”节。
GATT server接口¶
概述¶
GATT是一个基于蓝牙GAP连接的发送和接收数据的通用规范,支持在两个蓝牙设备间进行数据传输。
开发流程¶
GATT server主要接收对端设备的命令和请求,给对端设备发送响应、指示或者通知。
GATT server提供的接口如下表所示。
GATT server开发具体编程实例可参考application/samples/bt。
GATT server开发的典型流程:添加服务和特征及描述信息并启动服务。
调用gatts_register_callbacks,注册GATT server用户回调函数。
调用enable_ble,打开蓝牙开关。
调用gatts_register_server,创建一个server。
调用gatts_add_service,根据UUID创建service。
调用gatts_add_characteristic,对创建的服务添加特征值。
调用gatts_add_descriptor,对服务中的特征添加描述信息。
调用gatts_start_service,启动service。
启动广播,等待对端连接。
被对端使能为“可通知”后,调用gatts_notify_indicate或gatts_notify_indicate_by_uuid向对端发起特征值通知。
GATT client接口¶
概述¶
GATT是一个基于蓝牙GAP连接的发送和接收数据的通用规范,支持在两个蓝牙设备间进行数据传输。
开发流程¶
GATT client主要给对端发送命令和请求,接收对端回复的响应、指示和通知。
GATT client提供的接口如下表所示。
GATT client开发的具体编程实例可参考application/samples/bt。
GATT client开发的典型流程:连接对端设备,发现对端设备的服务,读写对端特征值,订阅对端的通知或者指示。
调用gattc_register_callbacks,注册GATT client用户回调函数。
调用enable_ble,打开蓝牙开关。
调用gattc_register_client,创建一个client。
递归调用gattc_discovery_service,gattc_discovery_character和gattc_discovery_descriptor,获取对端的属性数据库。
调用gattc_write_req或gattc_write_cmd将关注的对端特征的客户端特征配置写为0x0001或0x0002,设置为前者时可收到关注特征的特征通知,设置为后者时可收到关注特征的特征指示。
调用相应读写接口操作GATT server的特征和描述符。
错误码¶
BLE错误码返回值如下表所示。
SLE开发流程¶
概述¶
WS53V100通过API(Application Programming Interface)面向开发者提供SLE功能的开发和应用接口,包括Device Discovery、Connection Manager, SSAP等。
各组件功能说明如下:
Device Discovery:星闪设备发现协议,包括设备管理、设备公开和设备发现接口。
Connection Manager:星闪连接管理协议,包括设备连接、配对相关接口。
SSAP:星闪服务交互协议(SparkLink Service Access Protocol),包含服务注册、服务发现、属性数据读写等功能相关接口。
Low Latency:低时延初始化和低时延数据收发接口。
说明:
该文档描述各个模块功能的基本流程和API接口描述。
Device Discovery接口¶
概述¶
Device Discovery接口是星闪设备发现协议的软件实现,主要功能有SLE设备开关、设备管理、设备公开和设备发现。
开发流程¶
打开SLE设备开关是使用SLE功能的首要条件,SLE启动后可进行设备信息管理,包括获取与设置本地设备名称、获取与设置本地设备地址和设置本地设备外观。
当SLE设备需要进行设备公开时,可先设置设备公开参数、设备公开数据,然后使能设备公开。
当SLE设备需要进行设备发现时,可先设置设备发现参数,然后使能设备发现,并通过回调函数观察发现到的设备公开数据包。
Device Discovery提供的接口如下表所示。
|
注: 若需使用NV或Efuse里的地址, 调用'get_dev_addr'接口获取当前已存储的地址, 然后调用本接口将地址设置到BTH与BTC。 |
|||
Device Discovery开发的典型流程如下,具体编程实例可参考application/samples/bt。
Terminal Node:
调用enable_sle,打开SLE开关。
调用sle_announce_seek_register_callbacks,注册设备公开和设备发现回调函数。
调用sle_set_local_addr,设置本地设备地址。
调用sle_set_local_name,设置本地设备名称。
调用sle_set_announce_param,设置设备公开参数
调用sle_set_announce_data,设置设备公开数据
调用sle_start_announce,启动设备公开。
Grant Node:
调用enable_sle,打开SLE开关。
调用sle_announce_seek_register_callbacks,注册设备公开和设备发现回调函数。
调用sle_set_local_addr,设置本地设备地址。
调用sle_set_local_name,设置本地设备名称。
调用sle_set_seek_param,设置设备发现参数。
调用sle_start_seek,启动设备发现,并在回调函数中获得正在进行设备公开的设备信息。
注意事项¶
若扫描不到设备,请先检查设备是否已在配对设备列表中,或者设备是否已与其他设备配对(此情况下需要先清除设备端配对信息)。
Connection Manager接口¶
概述¶
Connection Manager接口是星闪连接管理协议的软件实现,主要功能有连接、配对和读远端设备RSSI值。
开发流程¶
当设备需要与对端设备建立连接时,可向对端设备发起连接请求。在连接过程中,设备可读取远端设备RSSI值,当设备需要更新连接参数时,可向对端设备发起连接参数更新请求,当设备需要与对端设备配对时,可向对端设备发起配对请求。在配对过程中,可获取当前本端设备与指定对端设备的配对状态。设备可获取当前配对设备数量以及当前配对设备信息链表。
Connection Manager提供的接口如下表所示。
Connection Manager开发的典型流程如下,具体编程实例可参考application/samples/bt。
Terminal Node:
调用enable_sle,打开SLE开关。
调用sle_announce_seek_register_callbacks,注册设备公开和设备发现回调函数。
调用sle_connection_register_callbacks,注册连接管理回调函数。
调用sle_set_local_addr,设置本地设备地址。
调用sle_set_local_name,设置本地设备名称。
调用sle_set_announce_param,设置设备公开参数
调用sle_set_announce_data,设置设备公开数据
调用sle_start_announce,启动设备公开。
Grant Node:
调用enable_sle,打开SLE开关。
调用sle_announce_seek_register_callbacks,注册设备公开和设备发现回调函数。
调用sle_connection_register_callbacks,注册连接管理回调函数。
调用sle_set_local_addr,设置本地设备地址。
调用sle_set_local_name,设置本地设备名称。
调用sle_set_seek_param,设置设备发现参数。
调用sle_start_seek,启动设备发现,并在回调函数中获得正在进行设备公开的设备信息。
调用sle_connect_remote_device,向对端设备发起连接请求。
调用sle_pair_remote_device,向对端设备发起配对请求。
调用sle_get_paired_devices_num,获取当前配对设备数量。
调用sle_get_paired_devices,获取当前配对设备信息。
调用sle_get_pair_state,获取配对状态。
SSAP server接口¶
概述¶
SSAP是SLE发送和接收数据的通用规范,支持在两个SLE设备间进行数据传输。
开发流程¶
SSAP Server主要接收对端的请求和命令,向对端发送响应、通知和指示。
SSAP Server提供的接口如下表所示。
SSAP server开发的典型流程:注册SSAP server,注册本端属性数据库,接收对端的请求和命令,向对端发送通知和指示,具体编程实例可参考application/samples/bt。
调用enable_sle,打开SLE开关。
调用ssaps_register_callbacks,注册SSAP server回调。
调用sle_announce_seek_register_callbacks,注册设备公开和设备发现回调函数。
调用ssaps_register_server,创建一个server实体。
调用ssaps_add_service_sync、ssaps_add_property_sync、ssaps_add_descriptor_sync和ssaps_start_service注册本端属性数据库,每一个服务及其内容添加完成后调用ssaps_start_service启动服务。
调用sle_set_local_addr,设置本地设备地址。
调用sle_set_local_name,设置本地设备名称。
调用sle_set_announce_param,设置设备公开参数。
调用sle_set_announce_data,设置设备公开数据。
调用sle_start_announce,启动设备公开。
连接建立。
接收对端设备的读写请求,当对端设备读写需要授权的特征或描述符时,调用ssaps_send_response向对端发送响应并修改本端特征值。
当某个特征的客户端特征配置描述符为0x0001时,在特征值变化时向对端设备发送通知,当某个特征的客户端特征配置描述符为0x0002时,在特征值变化时向对端设备发送指示。
SSAP client接口¶
概述¶
SSAP是SLE发送和接收数据的通用规范,支持在两个SLE设备间进行数据传输。
开发流程¶
SSAP Client主要向对端发送请求和命令,接收对端的响应、通知和指示。
SSAP Client提供的接口如下表所示。
SSAP Client开发的典型流程:注册SSAP Client,查找对端属性数据库,向对端发送请求和命令,接收对端的通知和指示,具体编程实例可参考application/samples/bt。
SSAP Server:
调用enable_sle,打开SLE开关。
调用ssaps_register_callbacks,注册SSAP server回调。
调用sle_announce_seek_register_callbacks,注册设备公开和设备发现回调函数。
调用ssaps_register_server,创建一个server实体。
调用ssaps_add_service_sync、ssaps_add_property_sync、ssaps_add_descriptor_sync和ssaps_start_service注册本端属性数据库,每一个服务及其内容添加完成后调用ssaps_start_service启动服务。
调用sle_set_local_addr,设置本地设备地址。
调用sle_set_local_name,设置本地设备名称。
调用sle_set_announce_param,设置设备公开参数。
调用sle_set_announce_data,设置设备公开数据。
调用sle_start_announce,启动设备公开。
连接建立。
接收对端设备的读写请求,当对端设备读写需要授权的特征或描述符时,调用ssaps_send_response向对端发送响应并修改本端特征值。
当某个特征的客户端特征配置描述符为0x0001时,在特征值变化时向对端设备发送通知,当某个特征的客户端特征配置描述符为0x0002时,在特征值变化时向对端设备发送指示。
SSAP Client:
调用enable_sle,打开SLE开关。
调用ssapc_register_callbacks,注册SSAP client回调。
调用sle_announce_seek_register_callbacks,注册设备公开和设备发现回调函数。
调用ssapc_register_client,创建一个client实体。
递归调用ssapc_find_structure查找对端属性数据库。
如果关注对端某个特征,可调用ssapc_write_req或ssapc_write_cmd将该特征的客户端特征配置描述符写为0x0001或0x0002,前者可使能对端特征通知,后者可使能对端特征指示。
调用读写接口操作对端属性数据库。
错误码¶
SLE sdk使用错误码指示用户当前任务执行结果,如下表所示。
注意事项¶
协议栈默认不保存密钥到FLASH中。若需要持久化保存密钥,需参考《WS53V100 SDK开发环境搭建 用户指南》中” Menuconfig配置”节。当在Menuconfig中打开星闪/蓝牙模块的密钥持久化能力后,协议栈会将密钥加密保存;需要注意的是,不建议反复开关平台加密特性(即CONFIG_NV_SUPPORT_ENCRYPT),否则可能出现密钥预期不一致问题,具体原因见《WS53V100 NV存储 用户指南》中”注意事项”节。
SLE CHBA开发流程¶
概述¶
WS53V100通过API(Application Programming Interface)面向开发者提供SLE CHBA功能的开发和应用接口。主要功能为星闪接入Lwip协议栈进行以太网报文传输。
说明: 该文档描述各个模块功能的基本流程和API接口描述。
Sle CHBA Manager接口¶
概述¶
SLE CHBA Manager接口是星闪设备接入CHBA模式的软件实现,主要功能有CHBA模块的初始化与去初始化,星闪链路的添加与删除,以太报文的发送与接收接口注册等。
开发流程¶
当星闪设备需要接入以太网,使用IP传输时,启用SLE CHBA模块。
SLE CHBA Manager提供的接口如下表所示。
SLE CHBA Manager开发的典型流程如下,具体编程实例可参考application/samples/bt/sle_chba。
根据SLE开发流程使能SLE设备,并配置星闪地址。
调用sle_chba_netdev_create,初始化SLE CHBA模块。
参考编程实例sle_chba_netif_mng.c,调用lwip接口创建星闪的netif,将星闪地址配置为星闪netif的mac addr,适配lwip与chba模块的发送与接收函数,实现用户回调接口等初始化准备。
调用sle_chba_netdev_register_callbacks,完成用户回调接口注册。
根据SLE开发流程配置好SLE设备,与对端支持SLE CHBA 的SLE设备建立链路,并切换好链路参数。
调用sle_chba_netdev_add_link,将星闪链路添加进CHBA模块,由CHBA模块管理链路数据的收发。
注意事项¶
根据MAC地址规则,首字节最低有效位为0时为单播地址,首字节最低有效位为1时为多播地址。因此当把星闪地址配置为星闪netif的物理地址时需要将首字节最低位改为0。
当前以太网mtu最高可设置为1500B,加上以太网报文头总共1514B,包长不可超过1514B。
已向SLE CHBA添加的星闪链路不可同时使用SSAP收发数据。
错误码¶
注意事项¶
看门狗¶
WS53V100默认提供看门狗功能,看门狗功能是一个指定时间(可编程)的定时器,用于系统异常恢复,如果未得到更新则当定时器到期时会产生一个系统复位信号,当看门狗在到期之前关闭或进行踢狗动作(即刷新定时器),则不会产生复位信号。
看门狗提供接口如表1所示。
表 1 接口描述
看门狗功能的作用是为了暴露业务中出现卡死或无意义死循环的问题,正常业务流程中应当周期性进行踢狗操作,而当业务异常卡死或进入死循环时,踢狗操作得不到调度,便会在看门狗时间到期后触发复位信号。
修改看门狗定时时间步骤:
步骤1 调用uapi_watchdog_disable,去使能看门狗。(初始化时已默认使能)
步骤2 调用uapi_watchdog_set_time,设置定时时间。
步骤3 调用uapi_watchdog_enable,重新使能看门狗。
踢狗步骤:
步骤1 调用uapi_watchdog_kick,刷新看门狗定时器时间为设置的定时时间。
当前看门狗功能默认开启,定时时间为7s,仅在liteOS的IDLE线程中保留踢狗动作,因此在进行WiFi打流等较占用CPU和系统资源的上层应用场景下,IDLE线程可能无法得到调度,需要应用主动调用踢狗接口进行踢狗操作。
IPERF打流业务功能(kernel/liteos/liteos_v207.0.0/Huawei_LiteOS/net/los_iperf/src/los_iperf.c)进行踢狗动作示例代码:
static void IperfFeedWdg(void)
{
UINT32 ret = LOS_HistoryTaskCpuUsage(OsGetIdleTaskId(), CPUP_LAST_ONE_SECONDS);
if (ret < IPERF_MIN_IDEL_RATE) {
uapi_watchdog_kick();
}
}
void IperfServerPhase2(IperfContext *context)
{
int32_t recvLen;
struct sockaddr peer;
struct sockaddr *from = &peer;
socklen_t slen = sizeof(struct sockaddr);
socklen_t *fromLen = &slen;
BOOL firstData = FALSE;
IperfUdpHdr *udpHdr = (IperfUdpHdr *)context->param.buffer;
#ifdef LOSCFG_NET_IPERF_JITTER
if (IPERF_IS_UDP(context->param.mask)) {
context->udpStat->lastID = -1;
}
#endif
while ((context->isFinish == FALSE) && (context->isKilled == FALSE)) {
recvLen = recvfrom(context->trafficSock, context->param.buffer,
context->param.bufLen, 0, from, fromLen);
if (recvLen < 0) {
if ((firstData == FALSE) && (errno == EAGAIN)) {
continue;
}
IPERF_PRINT("recv failed %d\r\n", errno);
break;
} else if (recvLen == 0) { /* tcp connection closed by peer side */
context->isFinish = TRUE;
break;
} else {
if (firstData == FALSE) {
firstData = TRUE;
IperfServerFirstDataProcess(context, from, *fromLen);
from = NULL;
fromLen = NULL;
}
context->param.total += (uint32_t)recvLen;
if (IperfServerDataProcess(context, (uint32_t)recvLen) && ((int32_t)ntohl(udpHdr->id) < 0)) {
context->isFinish = TRUE;
break;
}
UNUSED(udpHdr);
#ifdef IPERF_FEED_WDG
IperfFeedWdg();
#endif /* IPERF_FEED_WDG */
}
}
gettimeofday(&context->end, NULL);
}




